/** Request 网络请求工具 更详细的 api 文档: https://github.com/umijs/umi-request */
import { extend } from 'umi-request';
import { notification } from 'antd';

const codeMessage: Record<number, string> = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

/**
 * @zh-CN 异常处理程序
 * @en-US Exception handler
 */
const errorHandler = (error: { response: Response }): Response => {
  const { response } = error;
  if (response && response.status) {
    const errorText = codeMessage[response.status] || response.statusText;
    const { status, url } = response;

    notification.error({
      message: `Request error ${status}: ${url}`,
      description: errorText,
    });
  } else if (!response) {
    notification.error({
      description: 'Your network is abnormal and cannot connect to the server',
      message: 'Network anomaly',
    });
  }
  return response;
};

export const methods = {
  get: 'GET',
  post: 'POST',
  put: 'PUT',
  patch: 'PATCH',
  delete: 'DELETE',
};

/**
 * @en-US Configure the default parameters for request
 * @zh-CN 配置request请求时的默认参数
 */
export const request = extend({
  errorHandler, // default error handling
  credentials: 'include', // Does the default request bring cookies
});

/**
 * 所有请求拦截器
 * process.env.NODE_ENV === 'production' ? A:B; (A是生成环境，B是本地)
 */
request.interceptors.request.use((url, options): any => {
  // const baseUrl = process.env.NODE_ENV === 'production' ? 'http://154.26.140.15:8000':'/api/';
  const baseUrl = '';
  // const baseUrl = '/api/';
  return {
    url: baseUrl + url,
    options: { ...options },
  };
});

/**
 * 所有响应拦截器
 */
request.interceptors.response.use(async (response, options): Promise<any> => {
  // console.log(response.status)
  if (response.status === 401){
    window.location.replace('/user/login')
  }
  const data = await response.clone().json();
  if (response.status >= 200 && response.status < 300) {
    const token = response.headers.get('Authorization');
    if (token && token != '') {
      localStorage.setItem('token', token);
    }
    return response;
  } else {
    return response;
  }
  // if ((status === 200 && data.code !== 1) || (status !== 200 && data.data !== undefined)) {
  //   // 处理参数问题
  //   let noParamUrl = url;
  //   if (url.indexOf('?') !== -1) {
  //     noParamUrl = url.substring(0, url.indexOf('?'));
  //   }
  //   const msg =
  //     data.data === null || data?.data?.exceptionMsg == null || data?.data?.exceptionMsg == ''
  //       ? data.msg
  //       : data.data.exceptionMsg;
  //   notification.error({
  //     message: `请求出错 [${data.code}]: ${noParamUrl}`,
  //     description: msg,
  //   });
  // }
  return response;
});
